package com.JMM;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 轻量级的同步机制
 * 保证多线程环境下变量的 相互性和 可见性，不保证原子性
 * */
public class VolatileDemo {

    /**
     * volatile 可见性
     * 保证原子性可以使用 synchronized 和 lock
     *  不使用 synchronized 和 lock保证原子性——> 原子类 Atomic类
     * */

    private volatile static int num = 0;
    private volatile static AtomicInteger nk = new AtomicInteger();//Atomic 整型类

    public static void main(String[] args) {
        test02();
    }
    public static void add(){
//        num++; //自增 不是原子性操作   获取-赋值-返回
        nk.getAndIncrement(); //原子类 自增
    }
    //原子性的使用
    public static void test02(){
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int i1 = 0; i1 < 1000; i1++) {
                    add();
                }
            }).start();
        }
        while (Thread.activeCount()>2){
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName()+" "+nk);
    }



    //验证可见性
    public static void test01(){
        new Thread(()->{
            while (num == 0){

            }
        }).start();
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        num = 1;
        System.out.println(num);
    }
}
